AWS CLIでデフォルトセキュリティグループのルールを一括削除してみたin全リージョン
こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。
突然ですが、この記事をご覧の皆さんは日々AWS環境のセキュリティチェックを行い、是正されているかと思います。
↓ この記事にもあるVPCのデフォルトセキュリティグループ(SG)のルールを残している。。なんてことは、もちろん無いですよね。
今日のブログでは、そんなデフォルトSGのルールを全リージョンで一括削除するスクリプトをご紹介します。
スクリプト紹介
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \ | while read REGION; do echo "# deleting sg-rules in ${REGION}" ### default SGのIDを取得し、IDごとに処理を実行 aws ec2 describe-security-groups --filters "Name=group-name,Values=default" --region "$REGION" --query "SecurityGroups[].GroupId" --output text | xargs -n1 echo \ | while read ID; do echo "# deleting default rule in ${ID}" SG=$(aws ec2 describe-security-groups --group-ids ${ID} --region "$REGION" --query "SecurityGroups[]" --output json) INGRESS=$(echo $SG | jq -r '.[].IpPermissions[]') EGRESS=$(echo $SG | jq -r '.[].IpPermissionsEgress[]') ### ingressを削除 if [ -n "$INGRESS" ]; then RESULT=$(aws ec2 revoke-security-group-ingress --group-id $ID --region "$REGION" --ip-permissions "$INGRESS" --query "Return") echo "# deleted ${ID} ingress" fi ### egressを削除 if [ -n "$EGRESS" ]; then RESULT=$(aws ec2 revoke-security-group-egress --group-id $ID --region "$REGION" --ip-permissions "$EGRESS" --query "Return") echo "# deleted ${ID} egress" fi done done
スクリプト自体は単純なものです。
リージョンごとに処理を実行します。複数VPC作成されていることを考慮し、 default
という名前のSGのIDをすべて取得し、そのIDごとにインバウンドルールとアウトバウンドルールを削除しています。
もっと綺麗な書き方もありそうなので、違う書き方があれば私のTwitterまでフィードバックをください!喜びます!
使い方
ただのAWS CLIなのでローカル環境から実行していただいても構いませんが、ここではAmazon CloudShellで実行します。
実施前の注意事項
注意事項です。
VPC作成時に用意されているデフォルトのSGは本来利用が推奨されていないものですが、念の為ご自身の環境で本当にデフォルトのSGを利用していないかどうかをご確認ください。
確認方法については下記記事をご参照ください。
Amazon CloudShellの起動
まずはAWSのマネジメントコンソールにログインしてください。
ログイン後、画面右上にある下記アイコン(下図赤枠部)からCloudShellを実行します。
もしくは下記リンクからでも実行可能です。
Amazon CloudShell(ap-northeast-1)
初めてCloudShellを利用する場合、aws --version
でawsコマンドが使えることだけ簡単に確認しましょう。
[cloudshell-user@ip-0-0-0-0 ~]$ aws --version aws-cli/2.11.3 Python/3.11.2 Linux/5.10.167-147.601.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off
スクリプト実行
それではスクリプトを実行します。CloudShellのコンソール上に上で紹介したスクリプトをただコピペするだけです。
[cloudshell-user@ip-0-0-0-0 ~]$ aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \ > | while read REGION; do > echo "# deleting sg-rules in ${REGION}" > ### default SGのIDを取得し、IDごとに処理を実行 > aws ec2 describe-security-groups --filters "Name=group-name,Values=default" --region "$REGION" --query "SecurityGroups[].GroupId" --output text | xargs -n1 echo \ > | while read ID; do > echo "deleting default rule in ${ID}" > SG=$(aws ec2 describe-security-groups --group-ids ${ID} --region "$REGION" --query "SecurityGroups[]" --output json) > INGRESS=$(echo $SG | jq -r '.[].IpPermissions[]') > EGRESS=$(echo $SG | jq -r '.[].IpPermissionsEgress[]') > ### ingressを削除 > if [ -n "$INGRESS" ]; then > RESULT=$(aws ec2 revoke-security-group-ingress --group-id $ID --region "$REGION" --ip-permissions "$INGRESS" --query "Return") > echo "# deleted ${ID} ingress" > fi > ### egressを削除 > if [ -n "$EGRESS" ]; then > RESULT=$(aws ec2 revoke-security-group-egress --group-id $ID --region "$REGION" --ip-permissions "$EGRESS" --query "Return") > echo "# deleted ${ID} egress" > fi > done > done
ペーストしたらEnterを押して実行します。
すると、以下のような実行結果が出てきます。
# deleting sg-rules in ap-south-1 deleting default rule in sg-xxxxxxxxxxxxx # deleted sg-xxxxxxxxxxxxx ingress # deleted sg-xxxxxxxxxxxxx egress (中略) deleting default rule in sg-yyyyyyyyyyyyy # deleted sg-yyyyyyyyyyyyy ingress # deleted sg-yyyyyyyyyyyyy egress
最後まで実行されればすべて削除完了です。お疲れ様でした!
参考
お世話になった神ブログ
AWS CLIに関するドキュメント
- describe-security-groups — AWS CLI 2.11.5 Command Reference
- revoke-client-vpn-ingress — AWS CLI 2.11.5 Command Reference
- revoke-security-group-egress — AWS CLI 2.11.5 Command Reference
最後に
皆さんもデフォルトSGのルールを放置することなく、ちゃんと削除する&使わないようにしましょう。
些細な内容ですが、本記事が皆さんのお役に立てれば幸いです。
以上、べこみんでした。